package com.ruoyi.system.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;
import com.ruoyi.common.core.domain.entity.SysMenu;

/**
 * 菜单表 数据层
 *
 * @author ruoyi
 */
public interface SysMenuMapper {
    /**
     * 查询系统菜单列表
     *
     * @param menu 菜单信息，用于筛选条件
     * @return 符合条件的菜单列表
     */
    public List<SysMenu> selectMenuList(SysMenu menu);

    /**
     * 查询所有用户的权限集合（去重）
     *
     * @return 所有权限字符串组成的列表
     */
    public List<String> selectMenuPerms();

    /**
     * 根据用户ID查询该用户可见的系统菜单列表
     *
     * @param menu 包含用户相关信息的菜单对象，用于构建查询条件
     * @return 用户可见的菜单列表
     */
    public List<SysMenu> selectMenuListByUserId(SysMenu menu);

    /**
     * 根据角色ID查询该角色拥有的权限列表
     *
     * @param roleId 角色唯一标识符
     * @return 该角色对应的权限字符串列表
     */
    public List<String> selectMenuPermsByRoleId(Long roleId);

    /**
     * 根据用户ID查询该用户拥有的权限列表
     *
     * @param userId 用户唯一标识符
     * @return 该用户对应的所有权限字符串列表
     */
    public List<String> selectMenuPermsByUserId(Long userId);

    /**
     * 查询完整的菜单树结构（适用于管理员等具有全部权限的角色）
     *
     * @return 完整的菜单树数据列表
     */
    public List<SysMenu> selectMenuTreeAll();

    /**
     * 根据用户ID查询该用户可访问的菜单树结构
     *
     * @param userId 用户唯一标识符
     * @return 用户可访问的菜单树列表
     */
    public List<SysMenu> selectMenuTreeByUserId(Long userId);

    /**
     * 根据角色ID查询其关联的菜单ID列表，支持父子节点联动控制
     *
     * @param roleId            角色ID
     * @param menuCheckStrictly 是否严格检查父子菜单关联关系
     * @return 已分配给该角色的菜单ID列表
     */
    public List<Long> selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly);

    /**
     * 根据菜单ID查询具体的菜单详细信息
     *
     * @param menuId 菜单唯一标识符
     * @return 对应的菜单实体对象
     */
    public SysMenu selectMenuById(Long menuId);

    /**
     * 判断指定菜单是否存在子菜单节点
     *
     * @param menuId 待检测的菜单ID
     * @return 存在子菜单返回大于0的结果，否则返回0
     */
    public int hasChildByMenuId(Long menuId);

    /**
     * 插入新的菜单信息到数据库中
     *
     * @param menu 待新增的菜单对象
     * @return 成功插入记录数（通常为1）
     */
    public int insertMenu(SysMenu menu);

    /**
     * 更新已存在的菜单信息
     *
     * @param menu 需要更新的菜单对象
     * @return 成功更新记录数（通常为1）
     */
    public int updateMenu(SysMenu menu);

    /**
     * 根据菜单ID删除对应的菜单记录
     *
     * @param menuId 待删除的菜单ID
     * @return 成功删除记录数（通常为1）
     */
    public int deleteMenuById(Long menuId);

    /**
     * 检查同一父级下是否有重复的菜单名称
     *
     * @param menuName 要校验的菜单名称
     * @param parentId 父级菜单ID
     * @return 若存在同名则返回对应菜单对象，否则返回null
     */
    public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId);
}
